Profile picture

[Linux] 부팅 가능한 백업 디스크 만들기

JaehyoJJAng2025년 08월 20일

개요

이번 게시글에서는 리눅스 시스템의 디스크를 완벽하게 복제하여,

어떤 서버에 꽂아도 바로 부팅이 가능한 백업 디스크를 만드는 방법을 상세하게 다뤄보겠습니다.


예를 들어, 특정 서비스를 위한 리눅스 시스템 데이터를 새로운 서버에 그대로 옮겨야 하는 상황을 가정해 보겠습니다.


단순 파일 복사만으로는 부팅이 불가능하죠?

파티션 구조부터 부트로더까지 완벽하게 복제하는 전 과정을 차근차근 알아보겠습니다.


또한, 이번 실습을 진행하며 발생했던 문제 중 하나인 PERC H755와 같은 하드웨어 RAID 컨트롤러가 장착된 서버에서 발생할 수 있는 부팅 문제(dracut shell 진입)와 그 해결 방법까지 확실하게 알아보겠습니다.


작업 환경 및 목표

  • 원본 서버 OS: Rocky Linux 8.5
  • 원본 디스크: /dev/sda
  • 백업(대상) 디스크: /dev/sdb
  • 파일 시스템: ext4

최종 목표

  1. 백업 디스크(/dev/sdb)를 서버의 첫 번째 베이에 장착했을 때 즉시 부팅되도록 만들기
  2. 데이터, 파티션, 부트로더 등 원본 시스템과 100% 동일한 환경 구성
  3. UUID와 GRUB 부트로더를 새로운 디스크 환경에 맞게 완벽하게 재설정
  4. 하드웨어 RAID 환경에서도 부팅이 가능하도록 initramfs(램디스크)에 드라이버 추가

1. 시스템 분석하기

복제를 시작하기 전에, 현재 시스템 구조를 정확히 파악해야 합니다.


1-1. 디스크 구조 확인

lsblk -f 명령어로 원본 디스크의 파티션 구조, 파일 시스템, UUID 등을 확인합니다. 이 구조를 그대로 백업 디스크에 복제할 것입니다.

$ lsblk -f

NAME   FSTYPE  LABEL                 UUID                                 MOUNTPOINT
sda
├─sda1 ext4                          b872670d-c246-42b6-b6ca-726cbb5f84f1 /boot
├─sda2 ext4                          1db98286-8f85-4eb5-8401-3687d32e374b /
├─sda3 ext4                          09bce61c-ebf9-46a4-941a-914765dfd295 /home
├─sda4
├─sda5 ext4                          e2908828-a2c7-466c-8c20-3470f4e4f0aa /var
├─sda6 ext4                          0204874b-5ce9-41cf-8ce1-1514e8e842cf /usr
└─sda7 swap                          b8d18a55-97f4-4eaa-be4a-27dc123f8c9e [SWAP]
sdb

1-2. 부트 모드 확인

부트 모드에 따라 GRUB 설치 방법이 달라지므로, 현재 시스템이 UEFI인지 Legacy BIOS인지 확인해야 합니다.

# 아래 명령어를 실행하여 결과를 확인합니다.
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "Legacy BIOS"

2. 디스크 준비하기

이제 백업 디스크(/dev/sdb)를 깨끗한 상태로 만들어 원본 디스크의 '틀'을 복제할 준비를 합니다.


2-1. 백업 디스크 초기화

아래 명령어는 /dev/sdb의 모든 데이터를 영구적으로 삭제합니다. 디스크 경로를 반드시 두 번, 세 번 확인하세요!

# 1. 혹시 마운트되어 있다면 모든 파티션 마운트 해제
umount /dev/sdb* 2>/dev/null

# 2. 파티션 테이블 정보 완전 삭제
dd if=/dev/zero of=/dev/sdb bs=512 count=1
wipefs -a /dev/sdb

# 3. 깨끗해졌는지 확인
lsblk /dev/sdb
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# sdb    8:16   0  50G  0 disk

2-2. 파티션 테이블 복제

원본 디스크(/dev/sda)의 파티션 레이아웃을 백업 디스크(/dev/sdb)로 그대로 복사합니다.


2-2-1. GPT 디스크의 경우

# 파티션 테이블 복제
$ sgdisk -R /dev/sdb /dev/sda

# GUID 재생성 (원본 디스크와 동일한 GUID를 사용하면 충돌이 발생함!)
$ sgdisk -G /dev/sdb

# 커널에 알리기
$ partprobe /dev/sdb

2-2-2. MBR 디스크의 경우

# 파티션 테이블 복제
$ sfdisk -R /dev/sda | sfdisk /dev/sdb

# 커널에 알리기
$ partprobe /dev/sdb

2-2-3. 결과 확인

lsblk /dev/sdb 명령어로 파티션이 원본과 동일하게 생성되었는지 꼼꼼히 확인합니다.

$ lsblk /dev/sdb
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0   50G  0 disk 
├─sdb1   8:17   0  572M  0 part # /boot
├─sdb2   8:18   0   20G  0 part # /
├─sdb3   8:19   0 12.4G  0 part # /home
├─sdb4   8:20   0    1K  0 part 
├─sdb5   8:21   0   10G  0 part # /var
├─sdb6   8:22   0    5G  0 part # /usr
└─sdb7   8:23   0    2G  0 part # swap


3. 데이터 복제하기

이제 파티션이라는 '그릇'에 원본 데이터라는 '내용물'을 채울 차례입니다.


3-1. 파일시스템 생성

복제된 각 파티션에 파일 시스템을 생성해 줍니다. 이 과정에서 각 파티션은 새로운 고유 UUID를 할당받게 됩니다.

# EXT4로 포맷하기
$ mkfs.ext4 -O dir_index /dev/sdb1
$ mkfs.ext4 -O dir_index /dev/sdb2
$ mkfs.ext4 -O dir_index /dev/sdb3
$ mkfs.ext4 -O dir_index /dev/sdb5
$ mkfs.ext4 -O dir_index /dev/sdb6

# swap 영역 생성
$ mkswap /dev/sdb7

# 결과 확인
$ blkid /dev/sdb*
/dev/sdb: PTUUID="f5c9092a" PTTYPE="dos"
/dev/sdb1: UUID="33703e34-1a7c-40e2-b79c-567f83c84870" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-01"
/dev/sdb2: UUID="822ea40f-baa9-436c-967d-286e75732ad5" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-02"
/dev/sdb3: UUID="7bf55974-679a-4b7b-9499-4cb41d7509ed" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-03"
/dev/sdb4: PTTYPE="dos" PARTUUID="f5c9092a-04"
/dev/sdb5: UUID="3d544675-1383-4fac-8009-9edcbf9ab6cc" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-05"
/dev/sdb6: UUID="675003e7-b705-4152-916d-44855d10180d" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-06"
/dev/sdb7: UUID="d068b557-e4b5-4f6c-987e-b1fb9ee7b60b" TYPE="swap" PARTUUID="f5c9092a-07"

3-2. 마운트 포인트 준비

데이터를 복사하기 위해 백업 디스크의 파티션들을 임시 디렉터리에 순서대로 마운트합니다. 루트(/) 파티션을 가장 먼저 마운트하는 것이 중요합니다.

# 임시 마운트 포인트 생성
mkdir -p /mnt/backup

# 1. 루트 파티션(/dev/sdb2)을 먼저 마운트
mount /dev/sdb2 /mnt/backup

# 2. 루트 안에 나머지 마운트 포인트 디렉토리 생성
mkdir -p /mnt/backup/{boot,home,var,usr}

# 3. 나머지 파티션들을 순서대로 마운트
mount /dev/sdb1 /mnt/backup/boot
mount /dev/sdb3 /mnt/backup/home
mount /dev/sdb5 /mnt/backup/var
mount /dev/sdb6 /mnt/backup/usr

3-3. 데이터 복사 (rsync)

rsync를 사용하여 원본 시스템의 데이터를 백업 디스크로 복사합니다.

시스템 운영에 필수적이지만 복사할 필요는 없는 가상 파일 시스템들(/proc, /sys 등)은 제외합니다.

# -a: 아카이브 모드 (권한, 소유권 등 모든 속성 보존)
# -x: --one-file-system, 다른 파일 시스템으로 넘어가지 않음
# -v: 진행 과정 표시
# --exclude: 특정 디렉토리 제외
rsync -axv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/lost+found"} / /mnt/backup/

4. 부팅 가능하게 만들기 (핵심!)

데이터 복사만으로는 부팅되지 않습니다. 백업 디스크가 스스로 부팅할 수 있도록 부팅 정보를 심어주고, 변경된 UUID를 시스템에 알려줘야 합니다.


부트로더 설정 시 복제된 원본 디스크의 /etc/fstab 파일이나 부트로더 설정 파일을 그대로 사용하면 다음과 같은 문제가 발생할 수 있어요.

현재 상황:              디스크 교체 후:
/dev/sdb (hd1) ───→    /dev/sda (hd0)
     ↓                      ↓
GRUB이 hd1 참조        부팅 실패!

이를 막으려면 새로운 디스크의 UUID 값을 /etc/fstab에 매핑해주거나,

부트로더의 값을 변경하여 다시 생성해줘야 하는데요!

그 방법에 대해서 알아보도록 하죠.


4-1. UUID 기반 설정

UUID를 사용하면 디스크 위치와 무관하게 파티션을 찾을 수 있습니다.


1. UUID 매핑 테이블 만들기

# 각 파티션의 UUID 확인 및 저장
$ OLD_BOOT_UUID=$(blkid -s UUID -o value /dev/sda1)
$ NEW_BOOT_UUID=$(blkid -s UUID -o value /dev/sdb1)
$ OLD_ROOT_UUID=$(blkid -s UUID -o value /dev/sda2)
$ NEW_ROOT_UUID=$(blkid -s UUID -o value /dev/sdb2)

echo "🔄 UUID 매핑:"
echo "Boot: $OLD_BOOT_UUID$NEW_BOOT_UUID"
echo "Root: $OLD_ROOT_UUID$NEW_ROOT_UUID"

2. fstab 수정하기

# fstab 백업
$ cp /mnt/backup/etc/fstab /mnt/backup/etc/fstab.backup

# UUID 교체
$ sed -i "s/$OLD_BOOT_UUID/$NEW_BOOT_UUID/g" /mnt/backup/etc/fstab
$ sed -i "s/$OLD_ROOT_UUID/$NEW_ROOT_UUID/g" /mnt/backup/etc/fstab

# 확인
$ cat /mnt/backup/etc/fstab

3. chroot 환경에서 GRUB 설치하기

# chroot 환경 준비
$ mount --bind /dev /mnt/backup/dev
$ mount --bind /proc /mnt/backup/proc
$ mount --bind /sys /mnt/backup/sys

# chroot 진입
$ chroot /mnt/backup

# GRUB 설정 확인
$ vi /etc/default/grub
# 다음 라인 추가/확인:
GRUB_DISABLE_LINUX_UUID=false

# device.map 수정 (중요!)
$ echo "(hd0) /dev/sdb" > /boot/grub2/device.map

# GRUB 설치
$ grub2-install --recheck /dev/sdb

# GRUB 설정 재생성
$ grub2-mkconfig -o /boot/grub2/grub.cfg

# SELinux 레이블 재설정
$ touch /.autorelabel

# chroot 종료
$ exit

4-2. fstab 직접 수정하기

1. fstab 수정하기

vim /etc/fstab

# 파티션 구조에 맞게 마운트되도록 수정
/dev/sda2       /                       ext4    defaults        1 1
/dev/sda1       /boot                   ext4    defaults        1 2
/dev/sda3       swap                    swap    defaults        0 0
/dev/sda5       /var                    ext4    defaults        0 0
/dev/sda6       /usr                    ext4    defaults        0 0
/dev/sda7       /home                   ext4    defaults        0 0

2. 작업 과정

# chroot 환경 준비
$ mount --bind /dev /mnt/backup/dev
$ mount --bind /proc /mnt/backup/proc
$ mount --bind /sys /mnt/backup/sys

# chroot 진입
$ chroot /mnt/backup

# grub 재생성
grub2-mkconfig -o /boot/grub2/grub.cfg

# grub 설정 변경
sed -i "s/sdb/sda/g" /disk/boot/grub2/grub.cfg
sed -i "s/hd1/hd0/g" /disk/boot/grub2/grub.cfg

# GRUB 바이너리 설치
grub2-install /dev/sdb

위 설정을 정상적으로 마쳤다면, 마운트를 해제하고 백업 디스크로 정상 부팅이 되는지 테스트를 진행해보시면 됩니다.

트러블슈팅

하드웨어 RAID 컨트롤러 환경 대응

복제한 디스크가 DELL PERC, HPE Smart Array 같은 하드웨어 RAID 컨트롤러 에 연결될 예정이라면,

부팅에 필요한 드라이버가 initramfs(초기 램디스크)에 포함되어 있어야 합니다.


그렇지 않으면 부팅 과정에서 루트 파일 시스템을 찾지 못하고 dracut 쉘로 빠지게 되는 문제가 발생하죠.


왜 이런 문제가 발생하는데요?

커널이 부팅된 직후, 실제 루트 파일 시스템을 마운트하기 전에 initramfs라는 작은 임시 시스템을 메모리에 올립니다. 이 임시 시스템에 RAID 카드 드라이버가 없으면, RAID 볼륨 자체를 인식하지 못해 그 위에 있는 루트 파일 시스템을 찾을 수 없게 되는 것입니다.


이를 해결하기 위해서 dracut 명령어로 initramfs를 다시 만들어줍시다.

# (chroot 내부에서 실행)

# 1. 원본 시스템에서 사용 중인 RAID 드라이버 확인 (chroot 밖에서 미리 실행)
# 예: lsmod | grep -i raid  (megaraid_sas, mpt3sas 등이 나올 수 있습니다)
# 이 예제에서는 'megaraid_sas'를 사용하겠습니다.

# 2. 현재 설치된 커널 버전 확인
KERNEL_VERSION=$(ls /lib/modules | tail -n 1)

# 3. dracut으로 initramfs 재생성 (RAID 드라이버 추가)
# --add-drivers 옵션으로 필요한 드라이버를 명시합니다.
dracut --force --add-drivers "megaraid_sas" /boot/initramfs-${KERNEL_VERSION}.img ${KERNEL_VERSION}

이제 마지막 단계입니다. 백업 디스크의 MBR 또는 EFI 파티션에 부트 로더를 설치하고,

새로운 설정에 맞게 구성 파일을 다시 생성해주겠습니다.

# (chroot 내부에서 실행)

# 1. GRUB 부트로더를 sdb 디스크에 설치
#    (주의: sdb가 아닌 sdb1과 같은 파티션을 지정하지 마세요)
grub2-install /dev/sdb

# 2. 새로운 fstab과 커널 정보를 바탕으로 GRUB 설정 파일 자동 생성
grub2-mkconfig -o /boot/grub2/grub.cfg

# 3. (권장) SELinux 사용 시, 다음 부팅 때 파일 시스템 레이블을 재설정하도록 설정
touch /.autorelabel

# 4. 모든 작업 완료! chroot 환경에서 빠져나오기
exit
    Tag -

Loading script...